package com.itextpdf.text.pdf;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Font;
import com.itextpdf.text.FontFactory;
import com.itextpdf.text.Phrase;
import org.junit.Test;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.UUID;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class ConcurrentWriterTest {
@Test
public void test() throws InterruptedException {
final PDFAConcurrencyIssue prog = new PDFAConcurrencyIssue();
System.out.println("Creating only PDF/A documents");
prog.runTest(true, false);
System.out.println("Creating only normal PDF/A documents");
prog.runTest(false, true);
System.out.println("Creating PDF/A and normal documents");
prog.runTest(true, true);
System.out.println("Done");
}
public class PDFAConcurrencyIssue {
public PDFAConcurrencyIssue() {
FontFactory.register("./src/test/resources/com/itextpdf/text/pdf/FreeSans.ttf");
}
class Archive implements Runnable {
public void run() {
try {
createPdfA(PdfAConformanceLevel.PDF_A_1B);
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
public void createPdfA(PdfAConformanceLevel level) throws IOException, DocumentException {
final Document doc = new Document();
OutputStream out = new ByteArrayOutputStream();
final PdfAWriter writer = PdfAWriter.getInstance(doc, out, level);
doc.open();
final ICC_Profile icc = ICC_Profile.getInstance(new FileInputStream("./src/test/resources/com/itextpdf/text/pdf/sRGB Color Space Profile.icm"));
writer.setOutputIntents("Custom", "", "http://www.color.org", "sRGB IEC61966-2.1", icc);
writer.createXmpMetadata();
final Font font = FontFactory.getFont("FreeSans", BaseFont.IDENTITY_H, true, 12);
doc.add(new Phrase("Hello, " + level + " world!", font));
doc.add(new Phrase(UUID.randomUUID().toString(), font));
doc.close();
}
}
class Normal implements Runnable {
public void run() {
try {
final Document doc = new Document();
OutputStream out = new ByteArrayOutputStream();
final PdfWriter writer = PdfWriter.getInstance(doc, out);
doc.open();
final Font font = FontFactory.getFont("FreeSans", BaseFont.IDENTITY_H, true, 12);
doc.add(new Phrase("Hello, PDF world!", font));
doc.add(new Phrase(UUID.randomUUID().toString(), font));
doc.close();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
private void runTest(boolean createPDFA, boolean createNormal) throws InterruptedException {
final ExecutorService service = Executors.newFixedThreadPool(8);
Archive a = new Archive();
Normal n = new Normal();
for (int i = 0; i < 1000; i++) {
if (createPDFA) {
service.submit(a);
}
if (createNormal) {
service.submit(n);
}
}
service.shutdown();
service.awaitTermination(3600, TimeUnit.SECONDS);
}
}
}